El objetivo de este cuaderno es explorar la regresión logística y la ingeniería de características con las funciones de machine learning.En este cuaderno, se utilizará la sabana de notas de los estudiantes para predecir la nota de matematicas determinando si paso o no la asignatura.* Se usa SFrames para hacer algunas funciones de ingeniería* Se entrena un modelo de regresión logística para predecir la calificacion de matematicas de los estudiantes.* Se inspeccionan los pesos (coeficientes) de un modelo entrenado de regresión logística.* Se hace una predicción (tanto de clase como de probabilidad) de la calificación para una nueva nota de la asignatura.* Dados los pesos de regresión logística, los predictores y las notas de verdad básica, se crea una función para calcular la **precisión** del modelo.* Se inspeccionan los coeficientes del modelo de regresión logística e interpreta sus significados con el fin de determinar las probabilidades.* Se comparan dos modelos de regresión logistica para determinar cual es mejorEl objetivo de este cuaderno es explorar la regresión logística y la ingeniería de características con las funciones de machine learning.
En este cuaderno, se utilizará la sabana de notas de los estudiantes para predecir la nota de matematicas determinando si paso o no la asignatura.
xxxxxxxxxximport pandas as pdimport turicreate as trimport numpy as npimport matplotlib.pyplot as pltimport osfrom sklearn.model_selection import train_test_split## Preparación y Entendimiento de los datosSe utilizara un conjunto de datos que consiste en la sabana de notas de los estudiantes.Se utilizara un conjunto de datos que consiste en la sabana de notas de los estudiantes.
xxxxxxxxxxruta = 'https://drive.google.com/uc?id=12y4Yirhk1B-Cy6jMTeMPa1SHHdxAuhFm&export=download&authuser=0'students=tr.SFrame.read_csv(ruta, '&')Ahora se puede tener una vista previa de como se ve el conjunto de datosAhora se puede tener una vista previa de como se ve el conjunto de datos
xxxxxxxxxxstudents.head()Se borran los estudiantes que tienen la nota menor a 0 ya que estos estudiantes no continuaron sus estudiosSe borran los estudiantes que tienen la nota menor a 0 ya que estos estudiantes no continuaron sus estudios
xxxxxxxxxxstudents=students[students['CALCULO']>0]Se crea funcion para convertir caracteristicas categoricas en 0 y 1Se crea funcion para convertir caracteristicas categoricas en 0 y 1
xxxxxxxxxxdef convertCategory(df, variable): #df = df.to_dataframe() var = pd.get_dummies(df[variable], prefix=variable) df = df.drop(variable, axis=1) var = var.iloc[:, [1]] df = pd.concat([df,var],axis=1) return dfSe crea funcion para renombrar las caracteristicas categoricasSe crea funcion para renombrar las caracteristicas categoricas
xxxxxxxxxxdef renameCategory(df, variable): df = df.rename(columns={students.columns[-1]:variable}) return dfxxxxxxxxxx# Se convierten los datos a DataFramestudents = pd.DataFrame(students)xxxxxxxxxx#Se convierte y renombra la variable categorica S siendo 0 para mujeres y 1 para hombresstudents = convertCategory(students, 'S')students = renameCategory(students, 'S')#Se convierte y renombra la variable categorica R siendo 1 para Repitentes y 0 para los que no repitieronstudents = convertCategory(students, 'R')students = renameCategory(students, 'R')#Se convierte y renombra la variable categorica J10 y J11 siendo 1 para mañana y 0 para tardestudents = convertCategory(students, 'J10')students = renameCategory(students, 'J10')students = convertCategory(students, 'J11')students = renameCategory(students, 'J11')Se verifican y validan que los tipos de datos de las columnas sehan adecuados para analizarSe verifican y validan que los tipos de datos de las columnas sehan adecuados para analizar
xxxxxxxxxxstudents.dtypesSe identifica que las notas de fisica esta en formato int, se convierte a float para mejorar la uniformidad de los datosSe identifica que las notas de fisica esta en formato int, se convierte a float para mejorar la uniformidad de los datos
xxxxxxxxxxstudents['FÍSICA'] = students['FÍSICA'].astype(float)Se visualizan la cantidad de filas y columna, que se encuentran en la sábana de notasSe visualizan la cantidad de filas y columna, que se encuentran en la sábana de notas
xxxxxxxxxxstudents.shapeEn la siguiente tabla se pueden ver información estadistica de las columnas que tienen valores numericosEn la siguiente tabla se pueden ver información estadistica de las columnas que tienen valores numericos
xxxxxxxxxxstudents.describe()Se identifica la correlación de la variables de las notas.Se identifica la correlación de la variables de las notas.
xxxxxxxxxxNotas = studentsNotas = Notas.drop(columns=['CURSO','AÑO','Estrato','S','R','J10','J11'])Notas.corr()Representación grafica de la correlación de las variables, las correlaciones positivas estan en amarillo y los colores mas claros indican una correlacion baja o nula.Representación grafica de la correlación de las variables, las correlaciones positivas estan en amarillo y los colores mas claros indican una correlacion baja o nula.
xxxxxxxxxxplt.matshow(students.corr())xxxxxxxxxx# Se convierten los datos a SFramestudents = tr.SFrame(students)En la siguiente tabla se pueden ver información estadistica de la caracteristica objetivo `CALCULO`En la siguiente tabla se pueden ver información estadistica de la caracteristica objetivo CALCULO
xxxxxxxxxxstudents['CALCULO'].summary()Histograma con regla de Sturges para las notas de CalculoSe puede apreciar en el histograma que los datos tienen una distribución sin muchos valores atipicosHistograma con regla de Sturges para las notas de Calculo
Se puede apreciar en el histograma que los datos tienen una distribución sin muchos valores atipicos
xxxxxxxxxxplt.hist(students['CALCULO'], bins= 1 + int(np.ceil(np.log2(len(students)))))plt.xlabel('Notas')plt.ylabel('Frecuencia')plt.title('Histograma Notas de Calculo')Diagrama de caja para las notas de CalculoEn este diagrama se puede identificar la nota media y donde se concentran la mayoria de los datosDiagrama de caja para las notas de Calculo
En este diagrama se puede identificar la nota media y donde se concentran la mayoria de los datos
xxxxxxxxxxplt.boxplot(students['CALCULO'])plt.ylabel('Frecuencia')plt.title('Boxplot de Notas de Calculo')De los anteriores diagramas se puede determinar que los datos de las notas de Calculo son viable para analisis ya que no son aleatorios y la mayoria de las notas se encuentran entre 57 y 75.De los anteriores diagramas se puede determinar que los datos de las notas de Calculo son viable para analisis ya que no son aleatorios y la mayoria de las notas se encuentran entre 57 y 75.
Una vez analizados los datos se crea una columna donde las notas que tengan una calificación de más de 60 para se revisaran como *positivas*, mientras que las que tengan una calificación menor de 60 seran *negativas*. Para la columna de Fracaso, se usa +1 para la revisión de clase positiva y -1 para la etiqueta de clase negativa.Una vez analizados los datos se crea una columna donde las notas que tengan una calificación de más de 60 para se revisaran como positivas, mientras que las que tengan una calificación menor de 60 seran negativas. Para la columna de Fracaso, se usa +1 para la revisión de clase positiva y -1 para la etiqueta de clase negativa.
xxxxxxxxxxstudents['Fracaso'] = students['CALCULO'].apply(lambda CALCULO : +1 if CALCULO >= 60 else -1)Se puede visualizar que el conjunto de datos contiene una columna adicional llamada Fracaso que es positivo(+1) o negativo (-1)Se puede visualizar que el conjunto de datos contiene una columna adicional llamada Fracaso que es positivo(+1) o negativo (-1)
xxxxxxxxxxfracaso = [ len(students[students['Fracaso'] == 1]) , len(students[students['Fracaso'] == -1])]fracasoGrafica de pastel de columna fracasoEn esta grafica se puede visualizar que la cuarta parte de los estudiantes tiende a perder la asignatura de Calculo, lo cual representará dificultades y/o posible desercion en su formación de educación superior en carreras que requieran de buenos conocimientos matematicos como los son las ingenierias.Grafica de pastel de columna fracaso
En esta grafica se puede visualizar que la cuarta parte de los estudiantes tiende a perder la asignatura de Calculo, lo cual representará dificultades y/o posible desercion en su formación de educación superior en carreras que requieran de buenos conocimientos matematicos como los son las ingenierias.
xxxxxxxxxxdesfase = (0,0.10)plt.pie(fracaso, labels= ["Positivo","Negativo"], autopct="%0.1f %%", explode=desfase)plt.title('Grafica paste de fracaso en Calculo')## División de los datos en conjuntos de entrenamiento y de pruebaSe realiza la división de los datos a los que se realizara el estrenamiento y prueba, donde se utilizara el 80% de los datos en el conjunto de entrenamiento y el 20% de los datos en el conjunto de prueba. Se usa seed = 1 para que los datos obtengan el mismo resultado.Se realiza la división de los datos a los que se realizara el estrenamiento y prueba, donde se utilizara el 80% de los datos en el conjunto de entrenamiento y el 20% de los datos en el conjunto de prueba. Se usa seed = 1 para que los datos obtengan el mismo resultado.
xxxxxxxxxxtrain_data, test_data = students.random_split(.7, seed=1)print(len(train_data))print(len(test_data))Se realiza la selección de caracteristicas teniendo en cuenta las variable dicotomicas, sin tener en cuenta el nombre de los estudiantes, la caracteristica `CALCULO` y la caracteristica `CONVENCIONES MINISTERIO` ya que se creo la caracteristica objetivo Fracaso.Se realiza la selección de caracteristicas teniendo en cuenta las variable dicotomicas, sin tener en cuenta el nombre de los estudiantes, la caracteristica CALCULO y la caracteristica CONVENCIONES MINISTERIO ya que se creo la caracteristica objetivo Fracaso.
xxxxxxxxxx# Se crea una variable donde se encontraran las columnascaracteristicas = students.column_names()[1:27]column_excluir = ["CALCULO", "CONVENCIONES MINISTERIO"]# Se elimina la caracteristica CALCULO y CONVENCIONES MINISTERIOcaracteristicas = sublist = [x for x in caracteristicas if x not in column_excluir]caracteristicas## Entrenamiento del clasificador de estudiantes con regresión logísticaAhora se utiliza la regresión logística para crear un clasificador de estudiantes en los datos de entrenamiento. Este modelo utilizará los valores students como una característica y la columna de Fracaso como objetivo. Se usará validation_set = None para obtener los mismos resultados que todos los demás.Ahora se utiliza la regresión logística para crear un clasificador de estudiantes en los datos de entrenamiento. Este modelo utilizará los valores students como una característica y la columna de Fracaso como objetivo. Se usará validation_set = None para obtener los mismos resultados que todos los demás.
xxxxxxxxxxstudents_model = tr.logistic_classifier.create(train_data, target = 'Fracaso', features = caracteristicas, validation_set=None)Ahora se puede visualizar el clasificador donde se evidencia que se encontro una solucion óptima.Ahora se puede visualizar el clasificador donde se evidencia que se encontro una solucion óptima.
xxxxxxxxxxstudents_modelCuando se tiene el modelo se pueden extraer los pesos (coeficientes) como un SFrameCuando se tiene el modelo se pueden extraer los pesos (coeficientes) como un SFrame
xxxxxxxxxxcoeficientes = students_model.coefficientscoeficientesHay un total de 25 coeficientes en el modelo. Los coeficientes positivos $w_j$ corresponden a pesos que causan notas positivas, mientras que los pesos negativos corresponden a notas negativas.El siguiente bloque de código calcula cuántos pesos son positivos (> = 0). (Sugerencia: la columna 'valor' en los pesos de SFrame debe ser positiva (> = 0)).Hay un total de 25 coeficientes en el modelo. Los coeficientes positivos corresponden a pesos que causan notas positivas, mientras que los pesos negativos corresponden a notas negativas.
El siguiente bloque de código calcula cuántos pesos son positivos (> = 0). (Sugerencia: la columna 'valor' en los pesos de SFrame debe ser positiva (> = 0)).
xxxxxxxxxxnum_coeficiente_positivo = 0num_coeficiente_negativo = 0for value in coeficientes['value']: if value >= 0: num_coeficiente_positivo += 1 else: num_coeficiente_negativo += 1print("Numero de coeficientes positivos: %s " % num_coeficiente_positivo)print("Numero de coeficientes negativos: %s " % num_coeficiente_negativo)Ahora que un modelo está entrenado, se realizan las predicciones sobre los **datos de la prueba**. Se realiza la exploración en el contexto de 3 ejemplos en el conjunto de datos de prueba. Se hace referencia a este conjunto de 3 ejemplos como **muestra_prueba_datos**.Ahora que un modelo está entrenado, se realizan las predicciones sobre los datos de la prueba. Se realiza la exploración en el contexto de 3 ejemplos en el conjunto de datos de prueba. Se hace referencia a este conjunto de 3 ejemplos como muestra_prueba_datos.
xxxxxxxxxxtest_data['CALCULO']xxxxxxxxxxmuestra_prueba_datos = test_data[13:16]print(muestra_prueba_datos['CALCULO'])muestra_prueba_datosProfundizando en la primera fila de **muestra_prueba_datos**. Este seria el detalle completo del estudiante:Profundizando en la primera fila de muestra_prueba_datos. Este seria el detalle completo del estudiante:
xxxxxxxxxxmuestra_prueba_datos[0]Esa estudiante perdio calculo adicionalmente es propenso a perder economia y quimica.En la siguiente fila de **muestra_prueba_datos**. Se puede evidenciar que es un buen estudiante, no perdio ninguna materia y no esta propenso a perder alguna otra.Esa estudiante perdio calculo adicionalmente es propenso a perder economia y quimica.
En la siguiente fila de muestra_prueba_datos. Se puede evidenciar que es un buen estudiante, no perdio ninguna materia y no esta propenso a perder alguna otra.
xxxxxxxxxxmuestra_prueba_datos[1]A continuación se realiza la predicción **clase** para **muestra_prueba_datos**. El `students_model` debe predecir **+1** si la nota es positiva y **- 1** si la nota es negativa. El **puntaje** (a veces llamado **margen**) para el modelo de regresión logística se define como:$$\mbox{puntaje}_i = \mathbf{w}^Th (\mathbf{x}_i)$$donde $h(\mathbf{x}_i)$ representa las características, por ejemplo, $i$. El siguiente código permitira obtener los **puntajes** usando Turi Create. Para cada fila, el **puntaje** (o margen) es un número en el rango entre **[- inf, inf]**.A continuación se realiza la predicción clase para muestra_prueba_datos. El students_model debe predecir +1 si la nota es positiva y - 1 si la nota es negativa. El puntaje (a veces llamado margen) para el modelo de regresión logística se define como:
donde representa las características, por ejemplo, . El siguiente código permitira obtener los puntajes usando Turi Create. Para cada fila, el puntaje (o margen) es un número en el rango entre [- inf, inf].
xxxxxxxxxxpuntajes = students_model.predict(muestra_prueba_datos, output_type='margin')print(puntajes)Los puntajes anteriormente obtenidos se pueden usar para hacer predicciones de clase de la siguiente manera:$$\hat{y} =\left\{\begin{array}{ll}+1 & \mathbf{w}^T h(\mathbf{x}_i) > 0 \\-1 & \mathbf{w}^T h(\mathbf{x}_i) \leq 0 \\\end{array}\right.$$Usando los puntajes, escriba el código para calcular $\hat{y}$, las predicciones de la clase:Los puntajes anteriormente obtenidos se pueden usar para hacer predicciones de clase de la siguiente manera:
Usando los puntajes, escriba el código para calcular , las predicciones de la clase:
xxxxxxxxxxpredicciones = puntajes.apply(lambda x: 1 if x > 0 else -1)# Se crea una función para usarla mas adelantedef Calcular_Prediccion(puntajes): prediccion = [] for puntaje in puntajes: if puntaje>0: prediccion.append(1) else:prediccion.append(-1) return prediccionprediccion = Calcular_Prediccion(puntajes)print (prediccion)print (predicciones)El siguiente código permite verificar que las predicciones de clase obtenidas en los cálculos anteriores sean las mismas que las obtenidas de Turi Create.El siguiente código permite verificar que las predicciones de clase obtenidas en los cálculos anteriores sean las mismas que las obtenidas de Turi Create.
xxxxxxxxxxprint(students_model.predict(muestra_prueba_datos))Para calcular las probabilidades de las predicciones de los puntajes se usa:$$P(y_i = +1 | \mathbf{x}_i,\mathbf{w}) = \frac{1}{1 + \exp(-\mathbf{w}^T h(\mathbf{x}_i))}$$Usando la variable **puntajes** calculada previamente, se puede calcular la probabilidad de que una nota sea positiva usando la fórmula anterior. Para cada fila, las probabilidades deben ser un número en el rango **[0, 1]**.Para calcular las probabilidades de las predicciones de los puntajes se usa:
Usando la variable puntajes calculada previamente, se puede calcular la probabilidad de que una nota sea positiva usando la fórmula anterior. Para cada fila, las probabilidades deben ser un número en el rango [0, 1].
xxxxxxxxxxprobabilidades = puntajes.apply(lambda x: 1 / (1 + np.math.exp(-x)))# Se crea una funcion para el calculo de la probabilidaddef Calcular_Probabilidad(puntajes): probabilidad = [] for puntaje in puntajes: probabilidad.append( 1/(1+np.math.exp(-puntaje))) return probabilidadprobabilidad = Calcular_Probabilidad(puntajes)print (probabilidad)print (probabilidades)El siguiente codigo permite verificar la probabilidad de las predicciones las cuales coinciden con las obtenidas de Turi Create.El siguiente codigo permite verificar la probabilidad de las predicciones las cuales coinciden con las obtenidas de Turi Create.
xxxxxxxxxxprint (students_model.predict(muestra_prueba_datos, output_type='probability'))## Encontrar los estudiantes con mayores probabilidades de tener buena notaAhora se puede examinar el conjunto de datos de prueba completo, **test_data**, y se usa Turi Create para formar predicciones en todos los puntos de datos de prueba para un rendimiento más rápido.Usando el `students_model`, se encuentrara las 20 revisiones en todo **test_data** con la **mayor probabilidad** de ser clasificado como **nota positiva**. Se hace referencia a estos como las "notas más positivos".Para calcular estas 20 notas principales, se realizan los siguientes pasos:1. Hacer predicciones de probabilidad en **test_data** usando el `students_model`. Se utiliza el metodo `.predict` para hacer predicciones sobre los datos de prueba, adicionalmente se usa la opción ` output_type = 'probability' ` para generar la probabilidad en lugar de solo la clase más probable).2. Ordenar los datos de acuerdo con las predicciones y elijir los primeros 20. Se utiliza el método `.topk` en un SFrame para encontrar las k filas superiores ordenadas según el valor de una columna especificada.Ahora se puede examinar el conjunto de datos de prueba completo, test_data, y se usa Turi Create para formar predicciones en todos los puntos de datos de prueba para un rendimiento más rápido.
Usando el students_model, se encuentrara las 20 revisiones en todo test_data con la mayor probabilidad de ser clasificado como nota positiva. Se hace referencia a estos como las "notas más positivos".
Para calcular estas 20 notas principales, se realizan los siguientes pasos:
students_model. Se utiliza el metodo .predict para hacer predicciones sobre los datos de prueba, adicionalmente se usa la opción output_type = 'probability' para generar la probabilidad en lugar de solo la clase más probable)..topk en un SFrame para encontrar las k filas superiores ordenadas según el valor de una columna especificada.xxxxxxxxxxtest_data['probability'] = students_model.predict(test_data, output_type='probability')test_data.topk('probability', k=20, reverse=False).print_rows(num_rows=20)## Encontrar los estudiantes con menores probabilidades de tener buena notaPara encontrar las "notas más negativas" se usan las probabilidades de predicción para encontrar las 20 revisiones en test_data con la probabilidad más baja de ser clasificada como una nota positiva.Para encontrar las "notas más negativas" se usan las probabilidades de predicción para encontrar las 20 revisiones en test_data con la probabilidad más baja de ser clasificada como una nota positiva.
xxxxxxxxxxtest_data.topk('probability', k=20, reverse=True).print_rows(num_rows=20)## Evaluar el Modelo, calcular la precisión y exactitud del clasificadorA continuación se evaluara la precisión del clasificador entrenado. La precisión viene dada por:$$\mbox{precisión} = \frac{\mbox{# ejemplos correctamente clasificados}}{\mbox{# total de ejemplos}}$$Esto se puede calcular de la siguiente manera:* **Paso 1:** Usar el modelo entrenado para calcular las predicciones de clase usa el método `predic`.* **Paso 2:** Contar el número de puntos de datos cuando las notas de clase predichas coincidan con las notas de verdad básica las cuales seran llamadas `notas_verdaderas`.* **Paso 3:** Dividir el número total de predicciones correctas por el número total de puntos de datos en el conjunto de datos.La siguiente función calcula la precisión de clasificación:A continuación se evaluara la precisión del clasificador entrenado. La precisión viene dada por:
Esto se puede calcular de la siguiente manera:
predic.notas_verdaderas.La siguiente función calcula la precisión de clasificación:
xxxxxxxxxxdef get_Precision_Clasificacion(model, data, true_notes): # Primero se obtienen las predicciones puntaje = model.predict(data, output_type='margin') # Se calcula el número de ejemplos correctamente clasificados countador_muestras_clasificadas_correctas = 0 notaPrediccion = Calcular_Prediccion(puntaje) for i in range(len(puntaje)): if notaPrediccion[i] == true_notes[i]: countador_muestras_clasificadas_correctas+=1 # Luego se calcula la precisión dividiendo num_correcto por el número total de ejemplos precision = countador_muestras_clasificadas_correctas/(len(puntaje)) return precision return precisionAhora, se calcula la precisión de clasificación del **students_model** en **test_data**.Ahora, se calcula la precisión de clasificación del students_model en test_data.
xxxxxxxxxxget_Precision_Clasificacion(students_model, train_data, train_data['Fracaso'])La precisión del modelo tambien se puede obtener con el metodo `evaluate` en el cual se evalua la precision y se realiza una matriz de confusión, donde se tienen en cuenta los datos de prueba y los datos de entrenamiento razon por la cual tiene un poco mas de precisión.La precisión del modelo tambien se puede obtener con el metodo evaluate en el cual se evalua la precision y se realiza una matriz de confusión, donde se tienen en cuenta los datos de prueba y los datos de entrenamiento razon por la cual tiene
un poco mas de precisión.
Evaluación del modelo con los datos de entrenamientoEvaluación del modelo con los datos de entrenamiento
xxxxxxxxxxstudents_model.evaluate(train_data)Evaluación del modelo con los datos de pruebaEvaluación del modelo con los datos de prueba
xxxxxxxxxxstudents_model.evaluate(test_data)Consolidado de los datos de entrenamiento y de pruebaConsolidado de los datos de entrenamiento y de prueba
xxxxxxxxxxstudents_model.evaluate(students)Se evalua la precisión con los datos de prueba y los datos de entrenamiento, evidenciando que es la misma que se dio como resultado la funcion `evaluate`Se evalua la precisión con los datos de prueba y los datos de entrenamiento, evidenciando que es la misma que se dio como resultado la funcion evaluate
xxxxxxxxxxget_Precision_Clasificacion(students_model, students, students['Fracaso'])Se realiza la predicción sobre todo el conjunto de datos de los estudiantesSe realiza la predicción sobre todo el conjunto de datos de los estudiantes
xxxxxxxxxxstudents["NotaPredicha"] = students_model.predict(students, output_type='probability')## Entrenar otro clasificador con menos caracteristicasSe usan todas la caracteristicas en el modelo anterior. Ahora se entrenará un modelo de regresión logística más simple utilizando solo un subconjunto de caracteristicas que aparecen en la sabana de notas. Para esta tarea, se seleccionaran solo las asignaturas. Estos son:Se usan todas la caracteristicas en el modelo anterior. Ahora se entrenará un modelo de regresión logística más simple utilizando solo un subconjunto de caracteristicas que aparecen en la sabana de notas. Para esta tarea, se seleccionaran solo las asignaturas. Estos son:
xxxxxxxxxxAsignaturas = ['ECONOMIA', 'FÍSICA', 'QUÍMICA', 'SOCIALES', 'EDUCACION ARTISTICA', 'RECREACIÓN Y DEPORTES', 'RELIGION', 'ETICA', 'FILOSOFIA', 'INGLES', 'LENGUA CASTELLANA', 'TRIGONOMETRIA', 'ADMINISTRACION', 'MANEJO ORDENADORES', 'PREPARACIÓN TECNOLÓGICA']xxxxxxxxxxlen(Asignaturas)## Entrenar un modelo de regresión logística en un subconjunto de datosAhora se crea un clasificador con **Asignaturas** como característica y ** Fracaso ** como objetivo.Ahora se crea un clasificador con Asignaturas como característica y ** Fracaso ** como objetivo.
xxxxxxxxxxsimple_model = tr.logistic_classifier.create(train_data, target = 'Fracaso', features=Asignaturas, validation_set=None, verbose=False)simple_modelAhora se calcula la precisión de clasificación utilizando la función `get_Precision_Clasificacion` que se implementó anteriormente.Ahora se calcula la precisión de clasificación utilizando la función get_Precision_Clasificacion que se implementó anteriormente.
xxxxxxxxxx#Precisión de Modelo con menos caracteristicasprint(get_Precision_Clasificacion(simple_model, test_data, test_data['Fracaso']))#Precisión de Modelo con mas caracteristicasprint(get_Precision_Clasificacion(students_model, test_data, test_data['Fracaso']))Ahora se revisa la precisión con los datos de entrenamientoAhora se revisa la precisión con los datos de entrenamiento
xxxxxxxxxx#Precisión de Modelo con menos caracteristicas en los datos de entrenamientoprint(get_Precision_Clasificacion(simple_model, train_data, train_data['Fracaso']))#Precisión de Modelo con mas caracteristicas en los datos de entrenamientoprint(get_Precision_Clasificacion(students_model, train_data, train_data['Fracaso']))De lo anterior se puede concluir que entre menos caracteristicas tenga el modelo menor es su precisión.De lo anterior se puede concluir que entre menos caracteristicas tenga el modelo menor es su precisión.
Se revisan los coeficientes de **simple_model**:Se revisan los coeficientes de simple_model:
xxxxxxxxxxsimple_model.coefficientsSe ordenan los coeficientes (en orden descendente) por el **valor** para obtener los coeficientes con el efecto más positivo en la nota.Se ordenan los coeficientes (en orden descendente) por el valor para obtener los coeficientes con el efecto más positivo en la nota.
xxxxxxxxxxsimple_model.coefficients.sort('value', ascending=False).print_rows(num_rows=21)Es bastante común usar el **clasificador de clase mayoritaria** como modelo de referencia (o referencia) para compararlo con su modelo de clasificador. El modelo clasificador mayoritario predice la clase mayoritaria para todos los puntos de datos. Por lo menos, debe vencer de manera saludable al clasificador de clase mayoritario, de lo contrario, el modelo (generalmente) no tiene sentido.A continuación se representa la clase mayoritaria en el **train_data**?Es bastante común usar el clasificador de clase mayoritaria como modelo de referencia (o referencia) para compararlo con su modelo de clasificador. El modelo clasificador mayoritario predice la clase mayoritaria para todos los puntos de datos. Por lo menos, debe vencer de manera saludable al clasificador de clase mayoritario, de lo contrario, el modelo (generalmente) no tiene sentido.
A continuación se representa la clase mayoritaria en el train_data?
xxxxxxxxxxnum_positive = (train_data['Fracaso'] == +1).sum()num_negative = (train_data['Fracaso'] == -1).sum()print(num_positive)print(num_negative)xxxxxxxxxxexactitud_entrenamiento = (num_positive)/(num_positive+num_negative)exactitud_entrenamientoAhora se calcula la precisión del clasificador de clase mayoritaria en **test_data** para evidenciar la relación de los datos.Ahora se calcula la precisión del clasificador de clase mayoritaria en test_data para evidenciar la relación de los datos.
xxxxxxxxxxnum_positive = (test_data['Fracaso'] == +1).sum()num_negative = (test_data['Fracaso'] == -1).sum()print(num_positive)print(num_negative)exactitud_prueba = (num_positive)/(num_positive+num_negative)exactitud_pruebaPara finalizar se exportan los datos resultantes del modelo con mejor precisión y exactitud a formato separado por comas en un documento llamados Estudiantes .csvPara finalizar se exportan los datos resultantes del modelo con mejor precisión y exactitud a formato separado por comas en un documento llamados Estudiantes .csv
xxxxxxxxxx# Se realiza la conversion de SFrame a dataframeEstudiantes = students.to_dataframe()# Se crea una carpeta llamada dir y se va a almacenar los datos resultantesruta = './dir'# Nombre del Archivoname = 'Estudiantes.csv'if not os.path.exists(ruta): os.mkdir(ruta)fullname = os.path.join(ruta, name)#Exportación de Datos a la ruta indicada# Estudiantes.to_csv(fullname)